package niuke.week3;

import java.util.Scanner;

/**
 给定数组arr，arr中所有的值都为正整数且不重复。
 每个值代表一种面值的货币，每种面值的货币可以使用任意张，再给定一个aim，代表要找的钱数，求组成aim的最少货币数。
 *
 *
 * 3 20
 * 5 2 3
 *
 * 输出
 * 4
 * 说明
 * 20=5*4
 */
public class FindMoneyMinNunber {
    static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        int n = sc.nextInt();
        int aim = sc.nextInt();

        int[] arr = new int[n];


        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }


        int [][] dp = new int[n][aim+1];

        for (int i = 0; i < n; i++) {
            for (int j = 1; j < aim + 1; j++) {
               dp[i][j] = -1;
            }
        }

        for (int i = 0; i*arr[0] <= aim; i++) {
            dp[0][i*arr[0]] = i;
        }

//        for (int i = 0; i < n; i++) {
//            for (int j = 0; j < aim + 1; j++) {
//                System.out.print(dp[i][j]+"\t");
//            }
//            System.out.println();
//        }

        for (int i = 1; i < n; i++) {
            for (int j = 1; j < aim + 1; j++) {
                int a = dp[i-1][j]!=-1?dp[i-1][j]:-1;//不用
                int b = j-arr[i]>=0 && dp[i][j-arr[i]]!=-1?dp[i][j-arr[i]]+1:-1;//用
//                System.out.println(i+" "+j+" "+a+" "+b+" "+Integer.min(a,b));
                if(a!=-1 && b!=-1)//两种情况都有效
                     dp[i][j] = Math.min(a,b);
                else//取有效的一种
                    dp[i][j] = Math.max(a,b);
            }
        }
//        System.out.println(dp[1][2]);

//        for (int i = 0; i < n; i++) {
//            for (int j = 0; j < aim + 1; j++) {
//                System.out.print(dp[i][j]+"\t");
//            }
//            System.out.println();
//        }
        System.out.println(dp[n-1][aim]);
    }
}